/***********************************************************************************
 * 文件名： soft_capture.h
 * 版本： 3
 * 说明：
 * 		利用IO中断和定时器，软件模拟硬件捕获输入组件。
 * 		可用于外部电平变化时间的检测。
 *      关键函数为 SoftCT_EvIOInt 函数，确保最高优先级响应，不被其他中断打断。
 *      在文件 soft_capture_config.h 进行正确的配置。
 * 修改记录：
 * 	2022/02/10: 初版。 黄均铭。
 *  2022/03/07：添加定时器查询模式
***********************************************************************************/
#ifndef _SOFT_CAPTURE_H_
#define _SOFT_CAPTURE_H_

#include "stddef.h"
#ifdef __NO_INCLUDE_PATH
#include "..\..\..\projects\prj\bsp\soft_capture_config.h"
#else
#include "soft_capture_config.h"
#endif
#include "..\..\polsys.h"

//==============================================================================
// 预定义 各种可能发生的事件枚举
//==============================================================================
typedef enum _softct_event_t 
{
    SOFTCT_EVENT_NULL = 0,   // 空事件
    SOFTCT_EVENT_CMB = 0x01, // 捕获事件
    SOFTCT_EVENT_OVF = 0x02, // 溢出事件
}softct_event_t;

//==============================================================================
// 配置预处理
//==============================================================================
#if (_SOFTCT_TIME_BITS == 32)
typedef u32 softct_value_t;
#elif (_SOFTCT_TIME_BITS == 16)
typedef u16 softct_value_t;
#else
typedef u8 softct_value_t;
#endif

//==============================================================================
// 为了伪函数优化而曝光的变量，不要直接使用。
//==============================================================================
extern volatile softct_value_t SoftCT_mCaptureValue;

//==============================================================================
// API
//==============================================================================

// IO口中断
void SoftCT_EvIOInt();

#ifndef _SOFTCT_USE_TIMER_QUERY
// 定时器溢出
void SoftCT_EvTimeout();
#endif

// 软捕获组件初始化
#define SoftCT_Init()   _SoftCT_TimInit()

// 获取当前发生的事件 启动_SOFTCT_USE_TIMER_QUERY功能为同步函数，否则为异步函数
softct_event_t SoftCT_GetEvent();

// 开始捕获，自动清除计数和状态，可定义结束之后事件通知
// 调用之前请先确认要捕获的IO口电平状态和中断使能状态，在IO中断服务函数中调用 SoftCT_EvIOInt 来通知SoftCT。
// 捕获结束后会自动停止捕获，效果同调用 SoftCT_Stop 。
void SoftCT_Run();

// 停止捕获
void SoftCT_Stop();

// 获取捕获的值
#define SoftCT_GetCapValue() SoftCT_mCaptureValue;


#endif
